/**
 * @file
 * @author dousha
 * @date 2020
 */

#ifndef SKYLAB_INTERRUPT_H
#define SKYLAB_INTERRUPT_H

#include <stdint.h>

/**
 * 系统调用编号
 */
typedef enum {
	/// 启动任务系统
	SVC_INIT = 0x00u,
	/// 任务退出
	SVC_EXIT = 0x01u,
	/// 时间片释放
	SVC_YIELD = 0x02u,
	/// 任务异常退出
	SVC_EXIT_ABNORMALLY = 0x11u,
} SystemCallType;

extern void interrupt_init();

extern void interrupt_disable();

extern void interrupt_enable();

/**
 * 系统调用处理程序。
 *
 * @invokedBy{startup.s}
 * 
 * @implementedIn{svc.s}
 */
extern void service_handler(uint32_t) __attribute__((naked));

/**
 * 可挂起系统调用处理程序。
 *
 * 用于进行任务切换。
 *
 * @invokedBy{startup.s}
 * 
 * @implementedIn{pendsv.s}
 */
extern void pending_service_handler() __attribute__((naked));

#endif //SKYLAB_INTERRUPT_H
